Матч 210, IP преобразователь (IPConverter)

Дивизион 1, Уровень 1

 

IP адрес представляет собой строку из четырех чисел, разделенных точками. Имеется строка, состоящая из последовательности цифр. Необходимо расставить между цифрами три точки так, чтобы строка содержала реальный IP адрес. Числа в IP адресе могут принимать значения от 0 до 255. Ведущих нулей в числах быть не может. Например, адрес “0.90.24.26” является допустимым, а “19.02.4.26” нет.

Во входной строке цифр ambiguousIP необходимо найти все такие расстановки трех точек между цифрами, для которых получаются реальные IP адреса.

 

Класс: IPConverter

Метод: vector<string> possibleAddresses(string ambiguousIP)

Ограничения: строка ambiguousIP содержит от 0 до 50 символов, ‘0’ £ ambiguousIP[i] £ ‘9’.

 

Вход. Строка ambiguousIP.

 

Выход. Массив, содержащий все возможные строки с реальными IP адресами, которые можно получить из ambiguousIP вставкой трех точек. Строки в массиве должны быть отсортированы лексикографически по возрастанию.

 

Пример входа

ambiguousIP

“1902426”

“0186290”

“3082390871771742784899852251737850570843857369760”

 

Пример выхода

{"1.90.24.26",

 "1.90.242.6",

 "19.0.24.26",

 "19.0.242.6",

 "190.2.4.26",

 "190.2.42.6",

 "190.24.2.6"}

{"0.18.62.90", "0.186.2.90", "0.186.29.0"}

{}

 

 

РЕШЕНИЕ

перебор

 

Лексикографически наибольшим IP адресом является адрес 255.255.255.255, наименьшим 0.0.0.0. Если входная строка содержит более 12 или менее 4 цифр, то из нее вставкой символов ‘.’ невозможно получить допустимый IP адрес. Иначе совершаем перебор позиций, в которые можно вставить символы ‘.’ при помощи тройного вложенного цикла. Для каждой расстановки точек проверям, являются ли четыре числа адреса допустимыми (они не должны начинаться с нуля если число состоит из более чем одной цифры, а также числа должны лежать в промежутке от 0 до 255). Если адрес является допустимым, заносим его в результирующий массив.

 

ПРОГРАММА

 

#include <cstdio>

#include <string>

#include <vector>

using namespace std;

 

int isCorrect(string s)

{

  if ((s[0] == '0') && (s.size() > 1)) return 0;

  int n = atoi(s.c_str());

  return (n <= 255);

}

 

class IPConverter

{

  public:

  vector<string> possibleAddresses(string ambiguousIP)

  {

    vector<string> res;

    string a, b, c, d;

    int i, j, k;

    if ((ambiguousIP.size() > 12) || (ambiguousIP.size() < 4)) return res;

    for(i = 0; i < 3; i++)

    for(j = i + 1; j < i + 4; j++)

    for(k = j + 1; k < j + 4; k++)

    {

      if (k >= ambiguousIP.size() - 1) break;

      a = ambiguousIP.substr(0,i+1);

      b = ambiguousIP.substr(i+1,j-i);

      c = ambiguousIP.substr(j+1,k-j);

      d = ambiguousIP.substr(k+1);

      if (isCorrect(a) && isCorrect(b) && isCorrect(c) && isCorrect(d))

        res.push_back(a + '.' + b + '.' + c + '.' + d);

    }

    return res;

  }

};